探討關於JOIN時,EXPLAIN顯示的欄位及其意義.
需要再建立一個Table.
CREATE TABLE AVDVD(
avid VARCHAR(10) NOT NULL PRIMARY KEY,
avname VARCHAR(50) NOT NULL,
galid INT UNSIGNED NOT NULL
);
INSERT INTO AVDVD(avid, avname, galid) VALUES
('IPTD-966', '犯された美人巨乳女教師', 1),
('IPTD-852', '爆乳家庭教師の猥褻レッスン', 1),
('BBI-146', 'ド淫乱浴衣美人の痴態', 2),
('BBI-136', '電撃復活', 2),
('DV-1314', '君と雨宿り', 4),
('DV-1231', '南国少女', 4),
('IPZ-138', 'ハメよん!カラダを張る女子アナSEX奮闘記', 3),
('IPZ-160', 'LOVE SEMEN', 3),
('IPZ-204', 'SUNBURST エロ過ぎる日焼けあと', 1),
('DV-1346', 'AVアイドル撮影会', 4),
('PGD-514', '美人OL痴漢地獄', 2);
來觀察尋找桜木凛的作品時,兩個Table JOIN,EXPLAIN產生的報告.
EXPLAIN SELECT g.name
, g.birth_year
, d.avname
FROM AVGals g
INNER JOIN AVDVD d
USING (galid)
WHERE g.name = '桜木凛'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: g
type: ref
possible_keys: PRIMARY,name
key: name
key_len: 62
ref: const
rows: 1
Extra: Using where
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: d
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 11
Extra: Using where; Using join buffer
先是依據 AVGals Table 找出兩個可能的key, 分別是PRIMARY與name,使用name,
const代表是精確的,rows:1代表只處理一筆資料;接著是AVDVD Table的情形,
type:ALL,也沒有任何索引可以引用,全表掃描.
至於Using join buffer 是因為之前有另外下SELECT * FROM AVDVD;並未列出.
所以資料已經進到Buffer裡面了,這次可以利用Buffer裡的資料.
進了Buffer以後,後續的查詢會較快.所以我們看一道指令的效能,
不能光看執行速度,還要了解是否有使用到Buffer,
這樣才能夠比較清楚了解其狀況.
接著在AVDVD新增galid索引.
ALTER TABLE AVDVD
ADD INDEX (galid);
再來觀察同樣的查詢的狀況.
EXPLAIN SELECT g.name
, g.birth_year
, d.avname
FROM AVGals g
INNER JOIN AVDVD d
USING (galid)
WHERE g.name = '桜木凛'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: g
type: ref
possible_keys: PRIMARY,name
key: name
key_len: 62
ref: const
rows: 1
Extra: Using where
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: d
type: ref
possible_keys: galid
key: galid
key_len: 4
ref: akina.g.galid
rows: 1
Extra:
可以看到第二個TABLE AVDVD,有利用到galid這個索引,
並且是與第一個TABLE AVGals透過galid關聯參考,再利用
索引找出資料,整個過程較前面需要全表掃描,消耗資源較少,
速度也會較快.